﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using Enums;
using Resources;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Excepciones;
using Vallejos.Negocio;

public partial class Seguridad_Usuarios_ModificacionUsuarios : System.Web.UI.Page
{
    private const string PaginaDeBusqueda = "BusquedaUsuarios.aspx";
    #region "Eventos De Pagina"

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            CargarListas();

            var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
            
            var persona = negocio.RecuperarEntidadEnEdicion<Persona>();
            if (persona != null)
                CargarPersona(persona);

            Master.BodyTag.Attributes.Add("onload", "VerificarInfoEmpresa()");
        }
    }

    protected void btnGuardar_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
            GuardarPersona();
    }

    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect(PaginaDeBusqueda);
    }

    protected void ddlAmbito_SelectedIndexChanged(object sender, EventArgs e)
    {
        ddlConcesionaria.Enabled = (IdAmbito)ddlAmbito.SelectedIndex == IdAmbito.Concesionarias;
        txtLegajo.Enabled = (IdAmbito)ddlAmbito.SelectedIndex != IdAmbito.Clientes;
        chkTieneEmpresa.Enabled = (IdAmbito)ddlAmbito.SelectedIndex == IdAmbito.Clientes;
    }
    #endregion

    #region Listas
    private void CargarListas()
    {
        CargarAmbitos();
        Cargarconcesionarias();
        CargarPerfiles();
    }

    private void CargarPerfiles()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlPerfil, negocio.LeerPerfiles(),
            "Id", "Nombre");
    }

    private void CargarAmbitos()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlAmbito, negocio.LeerAmbitos(),
            "IdAmbito", "Nombre");
    }

    private void Cargarconcesionarias()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlConcesionaria, negocio.LeerConcesionarias(),
            "Id", "RazonSocialNombre");
    }
    #endregion

    #region Metodos
    private void CargarPersona(Persona persona)
    {
        txtPassword.Enabled = false;
        txtConfirmacion.Enabled = false;
        ddlAmbito.SelectedIndex = (int)persona.Ambito.IdAmbito;
        ddlAmbito.Enabled = false;
        ddlConcesionaria.Enabled = false;
        txtNombreUsuario.Enabled = false;

        ctlInformacionPersonal.SetearDatos(persona.DatosPersonales);

        txtNombreUsuario.Text = persona.Usuario.Login;
        txtEmail.Text = persona.Usuario.Email;
        txtPassword.Text = persona.Usuario.Password;
        txtConfirmacion.Text = persona.Usuario.Password;
        ddlPerfil.SelectedValue = persona.Usuario.Perfil.Id.ToString();

        ctlInfoDomPersonal.SetearDatos(persona.DatosDomiciliarios);
        
        switch (persona.Ambito.IdAmbito)
        {
            case IdAmbito.Clientes:
                lblLegajo.Visible = false;
                txtLegajo.Visible = false;

                lblConcesionaria.Visible = false;
                ddlConcesionaria.Visible = false;

                var cliente = (Cliente) persona;

                if (cliente.DatosDeEmpresa != null)
                {
                    chkTieneEmpresa.Checked = true;
                    ctlInfoEmpresa.SetearDatos(cliente.DatosDeEmpresa.DatosDomiciliarios);
                    txtRazonSocial.Text = cliente.DatosDeEmpresa.RazonSocial;
                    txtCuit.Text = cliente.DatosDeEmpresa.CUIT;
                }

                break;
            case IdAmbito.Concesionarias:
                fsEmpresa.Visible = false;

                break;
            case IdAmbito.Banco:
                fsEmpresa.Visible = false;

                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
    
    private void GuardarPersona()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

        var persona = negocio.RecuperarEntidadEnEdicion<Persona>();
        var ambito = (IdAmbito) ddlAmbito.SelectedIndex;

        if(persona == null)
        {
            switch (ambito)
            {
                case IdAmbito.Clientes:
                    persona = new Cliente();
                    var cliente = persona as Cliente;
                    if(chkTieneEmpresa.Checked)
                    {
                        cliente.DatosDeEmpresa = cliente.DatosDeEmpresa ?? new InformacionDeEmpresa();
                        cliente.DatosDeEmpresa.DatosDomiciliarios =
                            ctlInfoEmpresa.ObtenerDatos(cliente.DatosDeEmpresa.DatosDomiciliarios == null ? 0 : cliente.DatosDeEmpresa.DatosDomiciliarios.Id);
                        cliente.DatosDeEmpresa.RazonSocial = txtRazonSocial.Text;
                        cliente.DatosDeEmpresa.CUIT = txtCuit.Text;
                    }

                    break;
                case IdAmbito.Concesionarias:
                    persona = new EmpleadoDeConcesionaria();
                    var empleadoDeConcesionaria = persona as EmpleadoDeConcesionaria;
                    empleadoDeConcesionaria.Legajo = txtLegajo.Text;
                    empleadoDeConcesionaria.Concesionaria = new Concesionaria{ Id = Convert.ToInt32(ddlConcesionaria.SelectedValue) };

                    break;
                case IdAmbito.Banco:
                    persona = new EmpleadoBancario();
                    var empleadoBancario = persona as EmpleadoBancario;
                    empleadoBancario.Legajo = txtLegajo.Text;

                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        persona.DatosDomiciliarios = persona.DatosDomiciliarios ?? new InformacionDomiciliaria();
        persona.DatosDomiciliarios = ctlInfoDomPersonal.ObtenerDatos(persona.DatosDomiciliarios == null ? 0 : persona.DatosDomiciliarios.Id);
        persona.Ambito = new Ambito {IdAmbito = (IdAmbito) ddlAmbito.SelectedIndex};

        persona.Usuario = persona.Usuario ?? new Usuario { Activo = true};
        persona.Usuario.Email = txtEmail.Text;
        persona.Usuario.Password = txtPassword.Text;
        persona.Usuario.Perfil = new Perfil { Id = Convert.ToInt32(ddlPerfil.SelectedValue) };

        persona.DatosPersonales = persona.DatosPersonales ?? new InformacionPersonal();

        persona.DatosPersonales = ctlInformacionPersonal.ObtenerDatos(persona.DatosPersonales.Id);

        persona.Usuario.Login = txtNombreUsuario.Text;
        try
        {
            negocio.GuardarPersona(persona);
            negocio.AlmacenarEntidadEnEdicion<Persona>(null);
            Response.Redirect(PaginaDeBusqueda);
        }
        catch (ExcepcionNegocio ex)
        {
            var validator = new CustomValidator { IsValid = false, ErrorMessage = ex.Message };
            Page.Validators.Add(validator);
        }
        catch (Exception)
        {
            var validator = new CustomValidator { IsValid = false, ErrorMessage = Resource.ErrorDesconocido };
            Page.Validators.Add(validator);
        }


    }
    #endregion

    
}